//delegate T NumberChanger<T>(T n); 型参数定义泛型委托
/*
T：结构（类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型）
T：类 （类型参数必须是引用类型，包括任何类、接口、委托或数组类型）
T：new() （类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时new() 约束必须最后指定）
T：<基类名> 类型参数必须是指定的基类或派生自指定的基类
T：<接口名称> 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
T：U
*/

using System;
using System.Collections.Generic;

delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{
  class TestDelegate
  {
    static int num = 10;
    public static int AddNum(int p)
    {
      num += p;
      return num;
    }

    public static int MultNum(int q)
    {
      num *= q;
      return num;
    }
    public static int getNum()
    {
      return num;
    }

    static void Main(string[] args)
    {
      // 创建委托实例
      NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
      NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
      // 使用委托对象调用方法
      nc1(25);
      Console.WriteLine("Value of Num: {0}", getNum());
      nc2(5);
      Console.WriteLine("Value of Num: {0}", getNum());
      Console.ReadKey();
    }
  }
}